package cn.edu.tbu.tydemo.webapi;

import cn.edu.tbu.tydemo.core.PageUtils;
import cn.edu.tbu.tydemo.domain.Student;
import cn.edu.tbu.tydemo.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.data.repository.query.Param;
import org.springframework.web.bind.annotation.*;
import org.thymeleaf.util.StringUtils;
import java.util.List;

@RestController
@RequestMapping("webapi/student")
public class StudentRestController {
@Autowired
private StudentService studentService;

/**
 * 读取的url:/webapi/student/list
 * @return
 */
@GetMapping("/list")
public List<Student> getAll(){
    List<Student> students = studentService.findAll();
    return students;
}
@GetMapping("/getbypage")
public PageUtils getByPage(@RequestParam(value = "page",defaultValue = "0") Integer page,
                           @RequestParam(value = "size",defaultValue = "10") Integer size,
                           @RequestParam(value = "name",defaultValue = "") String name,
                           @RequestParam(value = "sex",defaultValue = "") String sex){
    Page<Student> studentPage;
    if(StringUtils.isEmpty(sex) && StringUtils.isEmpty(name)){
        Pageable pageable = PageRequest.of(page,size, Sort.by("id"));
        studentPage = studentService.findAll(pageable);
    }
    else if(StringUtils.isEmpty(sex) && !StringUtils.isEmpty(name)) {
        Student student = new Student();
        student.setName(name);
        Pageable pageable = PageRequest.of(page, size, Sort.by("id"));

        ExampleMatcher matcher = ExampleMatcher.matching()
                .withMatcher("name", ExampleMatcher.GenericPropertyMatchers.contains());//模糊查询


        Example<Student> example = Example.of(student, matcher);

        studentPage = studentService.findAll(example, pageable);
    }
    else if(!StringUtils.isEmpty(sex) && StringUtils.isEmpty(name)){
        Student student = new Student();
        student.setSex(Integer.parseInt(sex));
        Pageable pageable = PageRequest.of(page,size, Sort.by("id"));

        ExampleMatcher matcher = ExampleMatcher.matching()
                .withMatcher("sex",ExampleMatcher.GenericPropertyMatchers.exact());//精确查询


        Example<Student> example = Example.of(student,matcher);

        studentPage = studentService.findAll(example,pageable);
    }
    else{
        Student student = new Student();
        student.setSex(Integer.parseInt(sex));
        student.setName(name);
        Pageable pageable = PageRequest.of(page,size, Sort.by("id"));

        ExampleMatcher matcher = ExampleMatcher.matching()
                .withMatcher("sex",ExampleMatcher.GenericPropertyMatchers.exact()) //精确查询
                .withMatcher("name",ExampleMatcher.GenericPropertyMatchers.contains());//模糊查询

        Example<Student> example = Example.of(student,matcher);
        studentPage = studentService.findAll(example,pageable);
    }
    PageUtils pageUtils = new PageUtils(studentPage.getContent(),studentPage.getTotalElements());
    return pageUtils;
}
/**
 * 读取的url：/webapi/student/search
 * @return
 */
@GetMapping("/search")
public List<Student> getByName(@Param("name") String name){
    List<Student> students = studentService.findByName(name);
    return students;
}

/**
 * 读取的url：/webapi/student/get/id
 * @return
 */
@GetMapping("/get/{id}")
public Student get(@PathVariable Integer id){
    Student student = studentService.findById(id);
    student.setPassword("");
    return student;
}

/**
 * 新增学生的方法./webapi/student/insert
 * @param student
 * @return
 */
@PostMapping("/insert")
public Student insert(Student student){
    Student student1 = studentService.insert(student);
    return student1;
}

/**
 * 更新学生的方法./webapi/student/update
 * @param student
 * @return
 */
@PutMapping("/update")
public Student update(Student student){
    Student oldstudent = studentService.findById(student.getId());
    if(StringUtils.isEmpty(student.getPassword())){
        student.setPassword(oldstudent.getPassword());
    }
    student = studentService.update(student);
    return student;
}

/**
 * 删除学生的方法./webapi/student/delete/id
 * @param id
 * @return
 */
@DeleteMapping("/delete/{id}")
public void delete(@PathVariable Integer id){
    studentService.delete(id);
}
}
